﻿//==============================================================================
// System 
//------------------------------------------------------------------------------
///**
//  @file       System.h
//  @brief      System
//  @author     Riki
//*/
//==============================================================================

#pragma once

//-------------------------------------------------------------------------
//
//-------------------------------------------------------------------------
#include "../Geometry/DrawingShapes.h"
#include "Event.h"

#if defined(LNOTE_ANDROID)
struct ANativeWindow;
#endif

namespace LNote
{
namespace Core
{
namespace System
{
class IEventListener;

//==============================================================================
// Window クラス
//------------------------------------------------------------------------------
///**
//  @brief      ウィンドウのインターフェイス
//*/
//==============================================================================
class Window
	: public Base::ReferenceObject
    //: public Base::Interface
{
public:

	//----------------------------------------------------------------------
	///**
	//  @brief      クライアント領域のサイズを取得する
	//*/	
	//----------------------------------------------------------------------
	virtual const Geometry::Size& getSize() = 0;

	//----------------------------------------------------------------------
	///**
	//  @brief      ウィンドウの可視状態を設定する
	//
	//  @param[in]  flag_ : true を設定すると表示する
	//*/	
	//----------------------------------------------------------------------
	virtual void setVisible( bool flag_ ) = 0;

	//----------------------------------------------------------------------
	///**
	//  @brief      フルスクリーンの有効設定
	// 
	//  @param[in]  flag_ : 有効フラグ
	// 
	//  @par
	//              flag_ に true を設定するとフルスクリーン、
	//              false を設定するとウィンドウモードになります。<br>
	//              この関数はウィンドウスタイルを変更して最大化するだけです。<br>
	//              <br>
	//              ユーザー定義ウィンドウの場合はなにもしません。<br>
	//*/	
	//----------------------------------------------------------------------
	virtual void setEnableFullScreen( bool flag_ ) = 0;

	//----------------------------------------------------------------------
	///**
	//  @brief      フルスクリーン状態かを判定する
	//
	//  @par
	//              ユーザー定義ウィンドウの場合は常に false です。
	//*/	
	//----------------------------------------------------------------------
    virtual bool isFullScreen() = 0;

	//----------------------------------------------------------------------
	///**
	//  @brief      ウィンドウのアクティブ状態を判定する
	//
	//  @retval     true  : アクティブ
	//  @retval     false : 非アクティブ
	//*/	
	//----------------------------------------------------------------------
	virtual bool isActive() = 0;

	//----------------------------------------------------------------------
	///**
	//  @brief      タイトルバーの文字列の後ろに追加で表示する文字列を設定する
	//
	//  @note
	//              基本的に内部用。FPS の表示に使ってます。
	//              64 文字まで設定可能。<br>
	//              <br>
	//              ユーザー定義ウィンドウの場合はなにもしません。<br>
	//*/	
	////---------------------------------------------------------------------
	virtual void setWindowTextFooter( const lnChar* format_, ... ) = 0;

	/// このウィンドウにマウスキャプチャを設定する
    virtual void captureMouse() = 0;

	/// このウィンドウからマウスキャプチャを削除する
    virtual void releaseMouseCapture() = 0;

	/// イベントリスナーのアタッチ (priority が大きいものが先に処理される。必ずデタッチすること)
    virtual void attachEventListener( IEventListener* listener, int priority ) = 0;

	/// イベントリスナーのデタッチ
    virtual void detachEventListener( IEventListener* listener ) = 0;


	/*
#if defined(LNOTE_WIN32)
	/// ウィンドウハンドルの取得
    virtual HWND getWindowHandle() = 0;
#elif defined(LNOTE_ANDROID)
	/// ANativeWindow の取得
    virtual ANativeWindow* getNativeWindow() = 0;
#endif
	*/

protected:

    virtual ~Window() {}
};

//==============================================================================
// ■ IEventListener
//------------------------------------------------------------------------------
///**
//  @brief      イベント処理を行うクラスの基底
//*/
//==============================================================================
class IEventListener
{
public:

	//----------------------------------------------------------------------
	///**
	//	@brief      メッセージ処理コールバック
	//  @return     true の場合、呼び出し側で他の処理を行わずに、すぐに処理を終了します。
	//*/	
	//----------------------------------------------------------------------
    virtual bool onEvent( const EventArgs& e ) = 0;

};

} // namespace System
} // namespace Core
} // namespace LNote

//==============================================================================
//
//==============================================================================